Mobility, Latent Trend and Omega for all states
- Mobility trend for all states (\(\phi\)). Covariate that describes human mobility. These data come from Unacast. We smooth the raw data from Unacast using a spline fit, resulting in the trajectories of human movement shown below. This covariate is used to reduce baseline transmission. Here we show the mobility trends from all 50 states. b) latent trend for all states (\(\psi\)). c) Relativie transmissibility (\(\omega\)) for all states. In each subplot, the read line is a non-weighted mean of all states.
Correlation between Omega and Prevalence
Sample period = March 1, 2020 through December 31, 2021
- predictor = omega(t); response = daily prevalence(t)
Joining, by = "date"
Joining, by = "date"
Joining, by = "date"
California, and mean across states, at varying lags
- predictor = AUC of omega over time; response = cumulative all infections over time
- predictor = AUC of omega; response = cumulative all infections


- map of same (correlation, by state)
To be made
Correlation between Mobility and Omega




R effective for all states
Cross Correlation among times series of R Effective

Correlation among times series of R Effective
Are pairwise state R_e correlation coefficients correlated with the distances between state centroids?
LS0tCnRpdGxlOiAiRmlndXJlcyIKYXV0aG9yOiAiRXJpYyBNYXJ0eSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlPVRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIG91dC53aWR0aCA9ICIxMDAlIikKbGlicmFyeShoZXJlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KHlhcmRzdGljaykKIyBsaWJyYXJ5KGdncHVicikKbGlicmFyeShnZ3N0YXRzcGxvdCkKc291cmNlKGhlcmU6OmhlcmUoImNvZGUvcmVzdWx0LWV4cGxvcmF0aW9uL2dldFJlZmYuUiIpKQoKYGBgCgpgYGB7ciBkYXRhfQphbGxfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gaGVyZTo6aGVyZSgib3V0cHV0L2N1cnJlbnQvIiksIHBhdHRlcm4gPSAiLmNzdiIpCnBhcmFtX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IGhlcmU6OmhlcmUoIm91dHB1dC9jdXJyZW50LyIpLCBwYXR0ZXJuID0gInBhcmFtcy1uYXR1cmFsLnJkcyIpCnN0YXRlX3N1bW1hcmllcyA8LSB0aWJibGUoKQpzdGF0ZV9wYXJhbWV0ZXJzIDwtIHRpYmJsZSgpCnN0YXRlX2xvZ2xpa3MgPC0gdGliYmxlKCkKc3RhdGVkZiA8LXJlYWRSRFMoaGVyZTo6aGVyZSgib3V0cHV0L2N1cnJlbnQiLCAic3RhdGVkZi5yZHMiKSkKc3RhdGV2ZWMgPC0gZ3N1YigiLmNzdiIsIiIsYWxsX2ZpbGVzKQphbGxzdGF0ZXNfcG9wIDwtIHN0YXRlZGYgJT4lIGZpbHRlcihzdGF0ZV9mdWxsICVpbiUgc3RhdGV2ZWMpICU+JSBwdWxsKHRvdGFsX3BvcCkgJT4lIHN1bSgpCgpmb3IoaSBpbiAxOmxlbmd0aChhbGxfZmlsZXMpKSB7CiAgZG9fZmlsZSA8LSBhbGxfZmlsZXNbaV0KICBsb2NhdGlvbiA8LSBzdWIoIi5jc3YiLCAiIiwgZG9fZmlsZSkKICBzdGF0ZV9tZXRhZGF0YSA8LSBzdGF0ZWRmICU+JSBmaWx0ZXIoc3RhdGVfZnVsbCA9PSBzdWIoIi5jc3YiLCAiIiwgZG9fZmlsZSkpCiAgc3RhdGVfcG9wIDwtIHN0YXRlX21ldGFkYXRhICU+JSBwdWxsKHRvdGFsX3BvcCkKICBzdGF0ZV9pbml0UjAgPC0gc3RhdGVfbWV0YWRhdGEgJT4lIHB1bGwoaW5pdFIwKQogIHN0YXRlX2JldGFfcyA8LSAoc3RhdGVfaW5pdFIwKi4xKQogIAogIHRtcHBhcmFtZmlsZSA8LSBoZXJlOjpoZXJlKCJvdXRwdXQvY3VycmVudCIsIHBhcmFtX2ZpbGVzW2ldKQogICMgdG1wIHN0YXRlIHBhcmFtcwogIHN0YXRlcGFycyA8LSByZWFkUkRTKHRtcHBhcmFtZmlsZSkgCgogIHN0YXRlcGFyc19maXhlZCA8LSBzdGF0ZXBhcnMgJT4lIAogICAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJwYXJhbSIpICU+JSAKICAgIGRwbHlyOjpmaWx0ZXIoaXNfZml0dGVkID09ICJubyIpICU+JSAKICAgIHNlbGVjdChwYXJhbSxYMSkgJT4lIAogICAgcGl2b3Rfd2lkZXIodmFsdWVzX2Zyb20gPSBYMSwgbmFtZXNfZnJvbSA9IHBhcmFtKSAlPiUgCiAgICBzZWxlY3QoLWMoTUlGX0lELCBMb2dMaWssIExvZ0xpa19TRSkpCgogIHN0YXRlcGFyc19maXR0ZWQgPC0gc3RhdGVwYXJzICU+JSAKICAgIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAicGFyYW0iKSAlPiUgCiAgICBkcGx5cjo6ZmlsdGVyKGlzX2ZpdHRlZCA9PSAieWVzIikgJT4lIAogICAgc2VsZWN0KHBhcmFtLFgxKSAlPiUgCiAgICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IFgxLCBuYW1lc19mcm9tID0gcGFyYW0pCiAgCiAgc3RhdGVwYXJzX2FsbG1sZSA8LSBiaW5kX2NvbHMoc3RhdGVwYXJzX2ZpeGVkLHN0YXRlcGFyc19maXR0ZWQpCiAgCiAgIyByZXN1bHRzCgogIHRtcGZpbGUgPC0gaGVyZTo6aGVyZSgib3V0cHV0L2N1cnJlbnQiLCBkb19maWxlKQogIHRtcCA8LSByZWFkLmNzdih0bXBmaWxlKSAlPiUgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUpKQogIGZpcnN0Y2FzZWRhdGUgPC0gdG1wJGRhdGUgJT4lIG1pbigpCiAgdG1wIDwtIHRtcCAlPiUKICAgIGZpbHRlcihzaW1fdHlwZSA9PSAic3RhdHVzX3F1byIgfCBpcy5uYShzaW1fdHlwZSksCiAgICAgICAgICAgdmFyaWFibGUgJWluJSBjKCJkYWlseV9jYXNlcyIsICJkYWlseV9kZWF0aHMiLCAiZGFpbHlfYWxsX2luZmVjdGlvbnMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjdHVhbF9kYWlseV9jYXNlcyIsICJhY3R1YWxfZGFpbHlfZGVhdGhzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vYmlsaXR5X3RyZW5kIiwgImxhdGVudF90cmVuZCIsICJjb21iaW5lZF90cmVuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zIiwgImN1bXVsYXRpdmVfZGVhdGhzIikpICU+JQogICAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgc2ltX3R5cGUsIHBlcmlvZCwgZGF0ZSwgdmFyaWFibGUsIG1lYW5fdmFsdWUpICU+JSAKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3ZhbHVlKSAlPiUKICAgICMgY2FsY3VsYXRlIHByZXZhbGVuY2UKICAgIG11dGF0ZShwcmV2YWxlbmNlID0gZGFpbHlfYWxsX2luZmVjdGlvbnMgLyAoc3RhdGVfcG9wLWN1bXVsYXRpdmVfZGVhdGhzKSkgJT4lIAogICAgIyBjYWxjdWxhdGUgb21lZ2EKICAgIG11dGF0ZShvbWVnYSA9IGNvbWJpbmVkX3RyZW5kICogc3RhdGVwYXJzX2FsbG1sZSRiZXRhX3MpICU+JSAKICAgICMgY2FsY3VsYXRlIG1lYW4gUwogICAgbXV0YXRlKFMgPSBzdGF0ZV9wb3AgLSBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zKSAlPiUgCiAgICBtdXRhdGUoc3VzY2VwdGlibGVfZnJhY3Rpb24gPSBTIC8gKHN0YXRlX3BvcCAtIGN1bXVsYXRpdmVfZGVhdGhzKSkgJT4lIAogICAgIyBjYWxjdWxhdGUgcQogICAgbXV0YXRlKHEgPSBnZXRfcSh0ID0gYXMubnVtZXJpYyhkYXRlLWZpcnN0Y2FzZWRhdGUpLCBwYXJhbXMgPSBzdGF0ZXBhcnNfYWxsbWxlKSkgJT4lCiAgICAjIGNhbGN1bGF0ZSBzCiAgICBtdXRhdGUocyA9IGdldF9zKHQgPSBhcy5udW1lcmljKGRhdGUtZmlyc3RjYXNlZGF0ZSksIHBhcmFtcyA9IHN0YXRlcGFyc19hbGxtbGUpKSAlPiUKICAgICMgY2FsY3VsYXRlIG1lYW4gUl9lCiAgICBtdXRhdGUoUl9lID0gZ2V0UmVmZihTID0gUywgCiAgICAgICAgICAgICAgICAgICAgICAgICBvbWVnYSA9IG9tZWdhLAogICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHEsCiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcywKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHN0YXRlcGFyc19hbGxtbGUpKSAlPiUKICAgIHBpdm90X2xvbmdlcihjb2xzID0gIWMobG9jYXRpb24sIHNpbV90eXBlLCBwZXJpb2QsIGRhdGUpLCAKICAgICAgICAgICAgICAgICBuYW1lc190byA9ICJ2YXJpYWJsZSIsIAogICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJtZWFuX3ZhbHVlIiwKICAgICAgICAgICAgICAgICB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpCgogIHN0YXRlX3N1bW1hcmllcyA8LSBiaW5kX3Jvd3Moc3RhdGVfc3VtbWFyaWVzLCB0bXApCn0KCiMgIyBGaXhlZCBwYXJhbWV0ZXJzIHRhYmxlCiMgYmV0YXNfbmFtZXMgPC0gcm5tc1tncmVwKCJiWzAtOV0rIiwgcm5tcyldICMgZmluZCBwYXJhbWV0ZXJzIHN0YXJ0aW5nIHdpdGggYiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyCiMgc3BsaW5lX2NvZWZmaWNpZW50cyA8LSBwYXN0ZSgiU3BsaW5lIGNvZWZmaWNpZW50IiwgZ3N1YigiYiIsIiIsIGJldGFzX25hbWVzKSkKIyBuYW1lcyhzcGxpbmVfY29lZmZpY2llbnRzKSA8LSBiZXRhc19uYW1lcwojIAojIHBhcmFtc192ZWMgPC0gYyhNSUZfSUQgPSAiTUlGIGlkIiwgCiMgICAgICAgICAgICAgICAgIExvZ0xpayA9ICJMb2cgTGlrZWxpaG9vZCIsIAojICAgICAgICAgICAgICAgICBMb2dMaWtfU0UgPSAiU0Ugb2YgTG9nIExpa2VsaWhvb2QiLCAKIyAgICAgICAgICAgICAgICAgYmV0YV9zID0gIlRyYW5zbWlzc2lvbiByYXRlIiwKIyAgICAgICAgICAgICAgICAgIyBSZWxhdGl2ZSBUcmFuc21pc3NpYmlsaXR5CiMgICAgICAgICAgICAgICAgIGZyYWNfdHJhbnNfZSA9ICJSZWxhdGl2ZSB0cmFuc21pc3NpYmlsaXR5IG9mIGxhdGVudCBpbmZlY3Rpb25zIiwKIyAgICAgICAgICAgICAgICAgZnJhY190cmFuc19hID0gIlJlbGF0aXZlIHRyYW5zbWlzc2liaWxpdHkgb2YgYXN5bXB0b21hdGljIGluZGl2aWR1YWxzIiwKIyAgICAgICAgICAgICAgICAgZnJhY190cmFuc19jID0gIlJlbGF0aXZlIHRyYW5zbWlzc2liaWxpdHkgb2YgZGV0ZWN0ZWQgc3ltcHRvbWF0aWMgaW5kaXZpZHVhbHMgcG9zdC1yZXBvcnRpbmciLAojICAgICAgICAgICAgICAgICBmcmFjX3RyYW5zX2ggPSAiUmVsYXRpdmUgdHJhbnNtaXNzaWJpbGl0eSBvZiBob3NwaXRhbGl6ZWQgaW5kaXZpZHVhbHMiLAojICAgICAgICAgICAgICAgICAjIFRpbWUgaW4gY29tcGFydG1lbnRzCiMgICAgICAgICAgICAgICAgIHRpbWVfZSA9ICJUaW1lIHNwZW50IGluIGxhdGVudCBjb21wYXJ0bWVudHMgKGRheXMpIiwKIyAgICAgICAgICAgICAgICAgdGltZV9hID0gIlRpbWUgc3BlbnQgaW4gYXN5bXB0b21hdGljIGNvbXBhcnRtZW50cyAoZGF5cykiLAojICAgICAgICAgICAgICAgICB0aW1lX3N1ID0gIlRpbWUgc3BlbnQgaW4gc3ltcHRvbWF0aWMsIHVuZGV0ZWN0ZWQgY29tcGFydG1lbnRzIChkYXlzKSIsCiMgICAgICAgICAgICAgICAgIHRpbWVfc2QgPSAiVGltZSBzcGVudCBpbiBzeW1wdG9tYXRpYywgZGV0ZWN0ZWQgY29tcGFydG1lbnRzIChkYXlzKSIsCiMgICAgICAgICAgICAgICAgIHRpbWVfYyA9ICJUaW1lIHNwZW50IGluIGRpYWdub3NlZCBjYXNlcyBjb21wYXJ0bWVudHMgKGRheXMpIiwKIyAgICAgICAgICAgICAgICAgdGltZV9oID0gIlRpbWUgc3BlbnQgaW4gaG9zcGl0YWxpemVkIGNvbXBhcnRtZW50cyAoZGF5cykiLAojICAgICAgICAgICAgICAgICAjIERldGVjdGlvbiB0aW1lCiMgICAgICAgICAgICAgICAgIG1heF9kaWFnX2ZhY3RvciA9ICJNYXhpbXVtIGZvciBmYWN0b3IgYnkgd2hpY2ggbW92ZW1lbnQgdGhyb3VnaCBJc2QgaGFwcGVucyBmYXN0ZXIgKHF1aWNrZXIgZGlhZ25vc2lzKSIsCiMgICAgICAgICAgICAgICAgIGRpYWdfcmFtcHVwID0gIlJhdGUgYXQgd2hpY2ggZmFzdGVyIGRpYWdub3NpcyByYW1wcyB1cCB0byBtYXgiLAojICAgICAgICAgICAgICAgICB0X2hhbGZfZGlhZyA9ICJUaW1lIGF0IHdoaWNoIGRpYWdub3NpcyBpcyBhdCA1MCUgb2YgbWF4IChpbiBkYXlzIHNpbmNlIHQgPSAxKSIsCiMgICAgICAgICAgICAgICAgICMgRGV0ZWN0aW9uIGZyYWN0aW9uCiMgICAgICAgICAgICAgICAgIG1heF9kZXRlY3RfZnJhYyA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGNhc2VzIHRoYXQgYXJlIGRldGVjdGVkIiwKIyAgICAgICAgICAgICAgICAgZGV0ZWN0X3JhbXB1cCA9ICJTcGVlZCBhdCB3aGljaCBmcmFjdGlvbiBkZXRlY3RlZCByYW1wcyB1cCIsCiMgICAgICAgICAgICAgICAgIHRfaGFsZl9kZXRlY3QgPSAiVGltZSBhdCB3aGljaCBpbmZlY3Rpb24gZGV0ZWN0aW9uIGZyYWN0aW9uIGlzIGF0IDUwJSBvZiBtYXggKGluIGRheXMgc2luY2UgdCA9IDEpIiwKIyAgICAgICAgICAgICAgICAgYmFzZV9kZXRlY3RfZnJhYyA9ICJNaW5pbXVtIGZyYWN0aW9uIGRldGVjdGVkIGF0IHQgPSAxIiwKIyAgICAgICAgICAgICAgICAgIyBGcmFjdGlvbiBhc3ltcHRvbWF0aWMKIyAgICAgICAgICAgICAgICAgZnJhY19hc3ltID0gIkZyYWN0aW9uIG9mIGxhdGVudCBpbmZlY3Rpb25zIHRoYXQgbW92ZSB0byBhc3ltcHRvbWF0aWMiLAojICAgICAgICAgICAgICAgICAjIEZyYWN0aW9uIGhvc3B0aWxpemVkCiMgICAgICAgICAgICAgICAgIGZyYWNfaG9zcCA9ICJGcmFjdGlvbiBvZiBkZXRlY3RlZCBjYXNlcyB0aGF0IGFyZSBob3NwaXRhbGl6ZWQiLAojICAgICAgICAgICAgICAgICAjIEZyYWN0aW9uIG9mIGhvc3BpdGFsaXphdGlvbnMgdGhhdCByZXN1bHQgaW4gZGVhdGgKIyAgICAgICAgICAgICAgICAgbWluX2ZyYWNfZGVhZCA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGhvc3BpdGFsaXphdGlvbnMgdGhhdCByZXN1bHQgaW4gZGVhdGgiLAojICAgICAgICAgICAgICAgICBtYXhfZnJhY19kZWFkID0gIk1heGltdW0gZnJhY3Rpb24gb2YgaG9zcGl0YWxpemF0aW9ucyB0aGF0IHJlc3VsdCBpbiBkZWF0aCIsCiMgICAgICAgICAgICAgICAgIGxvZ19oYWxmX2RlYWQgPSAiVGltZSBhdCB3aGljaCBkZWF0aCBmcmFjdGlvbiBpcyBhdCA1MCUgb2YgbWF4IChpbiBkYXlzIHNpbmNlIHQgPSAxKSIsCiMgICAgICAgICAgICAgICAgICMgRGlzcGVyc2lvbiBwYXJhbWV0ZXJzCiMgICAgICAgICAgICAgICAgIHRoZXRhX2Nhc2VzID0gIkRpc3BlcnNpb24gcGFyYW1ldGVyIGZvciBjYXNlIHJlcG9ydGluZyBvYnNlcnZhdGlvbiBwcm9jZXNzIiwKIyAgICAgICAgICAgICAgICAgdGhldGFfaG9zcHMgPSAiRGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIGhvc3BpdGFsaXphdGlvbiByZXBvcnRpbmcgb2JzZXJ2YXRpb24gcHJvY2VzcyIsCiMgICAgICAgICAgICAgICAgIHRoZXRhX2RlYXRocyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgZGVhdGggcmVwb3J0aW5nIG9ic2VyY2F0aW9uIHByb2Nlc3MiLAojICAgICAgICAgICAgICAgICBzaWdtYV9kdyA9ICJWYXJpYW5jZSBvZiB0aGUgc3RvY2hhc3RpY3MgcHJvY2VzcyBub2lzZSIsCiMgICAgICAgICAgICAgICAgICMgU3BsaW5lIGNvZWZmaWNpZW50cwojICAgICAgICAgICAgICAgICBzcGxpbmVfY29lZmZpY2llbnRzLAojICAgICAgICAgICAgICAgICAjIEluaXRpYWwgY29uZGl0aW9ucwojICAgICAgICAgICAgICAgICBTXzAgPSAiSW5pdGlhbCBudW1iZXIgb2Ygc3VzY2VwdGlibGUgaW5kaXZpZHVhbHMgb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICBFMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGxhdGVudCBpbmZlY3Rpb3VzIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKIyAgICAgICAgICAgICAgICAgSWExXzAgPSAiSW5pdGlhbCBudW1iZXIgb2YgYXN5bXB0b21hdGljIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKIyAgICAgICAgICAgICAgICAgSXN1MV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIHN5bXB0b21hdGljLCB1bmRldGVjdGVkIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKIyAgICAgICAgICAgICAgICAgSXNkMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIHN5bXB0b21hdGljLCBkZXRlY3RlZCBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiMgICAgICAgICAgICAgICAgIEMxXzAgPSAiSW5pdGlhbCBudW1iZXIgb2YgZGlhZ25vc2VkIGNhc2VzIG9uIHQgPSAxIiwKIyAgICAgICAgICAgICAgICAgSDFfMCA9ICJJbml0aWFsIG51bWJlciBvZiBob3NwaXRhbGl6ZWQgY2FzZXMgb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICBSXzAgPSAiSW5pdGlhbCBudW1iZXIgb2YgcmVjb3ZlcmVkIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKIyAgICAgICAgICAgICAgICAgRF8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGRlYXRocyBhZnRlciBob3NwaXRhbGl6YXRpb24gb24gdCA9IDEiLAojICAgICAgICAgICAgICAgICB0cmVuZF9zdGFydCA9ICJUcmVuZCIpCiMgCiMgdG1wcGFyYW1zIDwtIHJlYWRSRFModG1wcGFyYW1maWxlKQojIHJubXMgPC0gcm93Lm5hbWVzKHRtcHBhcmFtcykKIyBwYXJhbXNfbWFwIDwtIHRpYmJsZShQYXJhbWV0ZXIgPSBuYW1lcyhwYXJhbXNfdmVjKSwKIyAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9IHBhcmFtc192ZWMpCiMgZml4ZWRfcGFyYW1ldGVycyA8LSB0bXBwYXJhbXMgJT4lCiMgICBtdXRhdGUoUGFyYW1ldGVyID0gcm5tcykgJT4lCiMgICBmaWx0ZXIoaXNfZml0dGVkID09ICJubyIpICU+JQojICAgZHBseXI6OnNlbGVjdCgtaXNfZml0dGVkKSAlPiUKIyAgIGdhdGhlcigia2V5IiwgInZhbHVlIiwgLVBhcmFtZXRlcikgJT4lCiMgICBmaWx0ZXIoa2V5ID09ICJYMSIpICU+JQojICAgbGVmdF9qb2luKHBhcmFtc19tYXAsIGJ5ID0gIlBhcmFtZXRlciIpICU+JQojICAgZmlsdGVyKCFQYXJhbWV0ZXIgJWluJSBjKCJNSUZfSUQiLCAiTG9nTGlrIiwgIkxvZ0xpa19TRSIsICJ0cmVuZF9zdGFydCIsICJ0aGV0YV9ob3NwcyIsICJTXzAiKSkgJT4lCiMgICBkcGx5cjo6c2VsZWN0KFBhcmFtZXRlciwgRGVzY3JpcHRpb24sIHZhbHVlKSAlPiUKIyAgIG11dGF0ZShQYXJhbWV0ZXIgPSBpZmVsc2UoUGFyYW1ldGVyID09ICJFMV8wIiwgIkwxXzAiLCBQYXJhbWV0ZXIpKQoKIyBLZXkgRGF0ZXMKZnV0dXJlIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUgZmlsdGVyKHBlcmlvZCA9PSAiRnV0dXJlIikgJT4lIHB1bGwoZGF0ZSkgJT4lIHJhbmdlKCkKYnVybmluIDwtIGMoc3RhdGVfc3VtbWFyaWVzICU+JSBwdWxsKGRhdGUpICU+JSBtaW4oKSwgYXMuRGF0ZSgiMjAyMC0wMy0wMSIpKQpzYW1wbGVfcGVyaW9kIDwtIGMoYXMuRGF0ZSgiMjAyMC0wMy0wMSIpLGFzLkRhdGUoIjIwMjAtMTItMzEiKSkKCmBgYAoKIyBNb2JpbGl0eSwgTGF0ZW50IFRyZW5kIGFuZCBPbWVnYSBmb3IgYWxsIHN0YXRlcwoKYSkgTW9iaWxpdHkgdHJlbmQgZm9yIGFsbCBzdGF0ZXMgKCRccGhpJCkuIENvdmFyaWF0ZSB0aGF0IGRlc2NyaWJlcyBodW1hbiBtb2JpbGl0eS4gVGhlc2UgZGF0YSBjb21lIGZyb20gPGEgaHJlZj0iaHR0cHM6Ly93d3cudW5hY2FzdC5jb20vIiB0YXJnZXQ9Il9ibGFuayI+VW5hY2FzdDwvYT4uIFdlIHNtb290aCB0aGUgcmF3IGRhdGEgZnJvbSBVbmFjYXN0IHVzaW5nIGEgc3BsaW5lIGZpdCwgcmVzdWx0aW5nIGluIHRoZSB0cmFqZWN0b3JpZXMgb2YgaHVtYW4gbW92ZW1lbnQgc2hvd24gYmVsb3cuIFRoaXMgY292YXJpYXRlIGlzIHVzZWQgdG8gcmVkdWNlIGJhc2VsaW5lIHRyYW5zbWlzc2lvbi4gSGVyZSB3ZSBzaG93IHRoZSBtb2JpbGl0eSB0cmVuZHMgZnJvbSBhbGwgNTAgc3RhdGVzLiBiKSBsYXRlbnQgdHJlbmQgZm9yIGFsbCBzdGF0ZXMgKCRccHNpJCkuIGMpIFJlbGF0aXZpZSB0cmFuc21pc3NpYmlsaXR5ICgkXG9tZWdhJCkgZm9yIGFsbCBzdGF0ZXMuIEluIGVhY2ggc3VicGxvdCwgdGhlIHJlYWQgbGluZSBpcyBhIG5vbi13ZWlnaHRlZCBtZWFuIG9mIGFsbCBzdGF0ZXMuCgpgYGB7ciBjb3ZhcmlhdGUsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTcsIGV2YWwgPSBUUlVFfQphbGxfcGhpIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIodmFyaWFibGUgPT0gIm1vYmlsaXR5X3RyZW5kIikgJT4lCiAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgZGF0ZSwgbWVhbl92YWx1ZSkgJT4lCiAgcmVuYW1lKHBoaSA9IG1lYW5fdmFsdWUpICU+JSAKICBmaWx0ZXIoZGF0ZSA8PSBTeXMuRGF0ZSgpKQoKbWVhbl9waGkgPC0gYWxsX3BoaSAlPiUgZ3JvdXBfYnkoZGF0ZSkgJT4lIHN1bW1hcmlzZShwaGkgPSBtZWFuKHBoaSkpCgpnX3BoaSA8LSBnZ3Bsb3QoYWxsX3BoaSwgYWVzKHggPSBkYXRlLCB5ID0gcGhpLCBjb2xvciA9IGxvY2F0aW9uKSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgIyB5bGFiKCJIdW1hbiBtb3ZlbWVudFxuKCUgb2Ygbm9ybWFsKSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIkQiLCBkaXJlY3Rpb24gPSAtMSwgYWxwaGEgPSAuNiwgZW5kID0gLjc1KSArCiAgIyB0aGVtZV9kYXJrKGJhc2VfbGluZV9zaXplID0gMC41KSArCiAgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX3BoaSwgYWxwaGEgPSAuNiwgc2l6ZSA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICAjIGdlb21fcmVjdChhZXMoeG1pbj1mdXR1cmVbMV0sIHhtYXg9ZnV0dXJlWzJdLCB5bWluPTAsIHltYXg9MSkpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSBmdXR1cmVbMV0sIHhtYXggPSBmdXR1cmVbMl0sIHltaW4gPSAwLCB5bWF4ID0gMSwgYWxwaGEgPSAuMikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpCgpwX3BoaSA8LSBnX3BoaSAlPiUgcGxvdGx5OjpnZ3Bsb3RseSgpICU+JSAKICBwbG90bHk6OmxheW91dChzaG93bGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgIyBtYXJnaW4gPSBsaXN0KGwgPSAxNTApLAogICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQaGkiKQogICAgICAgICAgICAgICAgICkKCnBfcGhpJHgkZGF0YVtbNTFdXSR0ZXh0IDwtIGdzdWIoJ3JlZCcsJ01lYW4gb2YgYWxsIHN0YXRlcycsIHBfcGhpJHgkZGF0YVtbNTFdXSR0ZXh0KQoKIyBwX3BoaQpgYGAKCgpgYGB7cn0KYWxsX3BzaSA8LSBzdGF0ZV9zdW1tYXJpZXMgJT4lCiAgZmlsdGVyKHZhcmlhYmxlID09ICJsYXRlbnRfdHJlbmQiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUocHNpID0gbWVhbl92YWx1ZSkgJT4lIAogIGZpbHRlcihkYXRlIDw9IFN5cy5EYXRlKCkpCgptZWFuX3BzaSA8LSBhbGxfcHNpICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKHBzaSA9IG1lYW4ocHNpKSkKCmdfcHNpIDwtIGdncGxvdChhbGxfcHNpLCBhZXMoeCA9IGRhdGUsIHkgPSBwc2ksIGNvbG9yID0gbG9jYXRpb24pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICAjIHlsYWIoIkxhdGVudCB0cmVuZFxuKCUgb2Ygbm9ybWFsKSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIkQiLCBkaXJlY3Rpb24gPSAtMSwgYWxwaGEgPSAuNiwgZW5kID0gLjc1KSArCiAgIyB0aGVtZV9kYXJrKGJhc2VfbGluZV9zaXplID0gMC41KSArCiAgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX3BzaSwgYWxwaGEgPSAuNiwgc2l6ZSA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSBmdXR1cmVbMV0sIHhtYXggPSBmdXR1cmVbMl0sIHltaW4gPSAwLCB5bWF4ID0gMSwgYWxwaGEgPSAuMikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpCgpwX3BzaSA8LSBnX3BzaSAlPiUgcGxvdGx5OjpnZ3Bsb3RseSgpICU+JSAKICBwbG90bHk6OmxheW91dChzaG93bGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgIyBtYXJnaW4gPSBsaXN0KGwgPSAxNTApLAogICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQc2kiKQogICAgICAgICAgICAgICAgICkKCnBfcHNpJHgkZGF0YVtbNTFdXSR0ZXh0IDwtIGdzdWIoJ3JlZCcsJ01lYW4gb2YgYWxsIHN0YXRlcycsIHBfcHNpJHgkZGF0YVtbNTFdXSR0ZXh0KQoKIyBwX3BzaQpgYGAKCgpgYGB7cn0KYWxsX29tZWdhIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIodmFyaWFibGUgPT0gIm9tZWdhIikgJT4lCiAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgZGF0ZSwgbWVhbl92YWx1ZSkgJT4lCiAgcmVuYW1lKG9tZWdhID0gbWVhbl92YWx1ZSkgJT4lIAogIGZpbHRlcihkYXRlIDw9IFN5cy5EYXRlKCkpCgptZWFuX29tZWdhIDwtIGFsbF9vbWVnYSAlPiUgZ3JvdXBfYnkoZGF0ZSkgJT4lIHN1bW1hcmlzZShvbWVnYSA9IG1lYW4ob21lZ2EpKQoKbWF4X29tZWdhIDwtIG1heChhbGxfb21lZ2Ekb21lZ2EpCgpnX29tZWdhIDwtIGdncGxvdChhbGxfb21lZ2EsIGFlcyh4ID0gZGF0ZSwgeSA9IG9tZWdhLCBjb2xvciA9IGxvY2F0aW9uKSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgIyB5bGFiKCJMYXRlbnQgdHJlbmRcbiglIG9mIG5vcm1hbCkiKSArCiAgIyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gIkQiLCBkaXJlY3Rpb24gPSAtMSwgYWxwaGEgPSAuNiwgZW5kID0gLjc1KSArCiAgIyB0aGVtZV9kYXJrKGJhc2VfbGluZV9zaXplID0gMC41KSArCiAgZ2VvbV9saW5lKGRhdGEgPSBtZWFuX29tZWdhLCBhbHBoYSA9IC42LCBzaXplID0gMiwgY29sb3IgPSAncmVkJykgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGZ1dHVyZVsxXSwgeG1heCA9IGZ1dHVyZVsyXSwgeW1pbiA9IDAsIHltYXggPSBhbGxfb21lZ2Ekb21lZ2EsIGFscGhhID0gLjIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKQoKcF9vbWVnYSA8LSBnX29tZWdhICU+JSBwbG90bHk6OmdncGxvdGx5KCkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAjIG1hcmdpbiA9IGxpc3QobCA9IDE1MCksCiAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk9tZWdhIikKICAgICAgICAgICAgICAgICApCgpwX29tZWdhJHgkZGF0YVtbNTFdXSR0ZXh0IDwtIGdzdWIoJ3JlZCcsJ01lYW4gb2YgYWxsIHN0YXRlcycsIHBfb21lZ2EkeCRkYXRhW1s1MV1dJHRleHQpCgojIHBfb21lZ2EKYGBgCgpgYGB7cn0KcGxvdGx5OjpzdWJwbG90KHBfcGhpLCBwX3BzaSwgcF9vbWVnYSwgbnJvd3MgPSAzLCBzaGFyZVggPSBUUlVFLCB0aXRsZVkgPSBUUlVFKQpgYGAKCiMgQ29ycmVsYXRpb24gYmV0d2VlbiBPbWVnYSBhbmQgUHJldmFsZW5jZQoKU2FtcGxlIHBlcmlvZCA9IE1hcmNoIDEsIDIwMjAgdGhyb3VnaCBEZWNlbWJlciAzMSwgMjAyMQoKYSkgcHJlZGljdG9yID0gb21lZ2EodCk7IHJlc3BvbnNlID0gZGFpbHkgcHJldmFsZW5jZSh0KQoKYGBge3J9CgphbGxfcHJldmFsZW5jZSA8LSBzdGF0ZV9zdW1tYXJpZXMgJT4lCiAgZmlsdGVyKHBlcmlvZCA9PSAiUGFzdCIpICU+JQogIGZpbHRlcihiZXR3ZWVuKGRhdGUsIHNhbXBsZV9wZXJpb2RbMV0sIHNhbXBsZV9wZXJpb2RbMl0pKSAlPiUgCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcmV2YWxlbmNlIikgJT4lCiAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgZGF0ZSwgbWVhbl92YWx1ZSkgJT4lCiAgcmVuYW1lKHByZXZhbGVuY2UgPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkKCm1lYW5fYWxsX3ByZXZhbGVuY2UgPC0gYWxsX3ByZXZhbGVuY2UgJT4lIGdyb3VwX2J5KGRhdGUpICU+JSBzdW1tYXJpc2UocHJldmFsZW5jZSA9IG1lYW4ocHJldmFsZW5jZSkpCiMgcGxvdCh4ID0gbWVhbl9vbWVnYSRtZWFuX3ZhbHVlLCB5ID0gbWVhbl9hbGxfcHJldmFsZW5jZSRwcmV2YWxlbmNlKQoKbWVhbnMgPC0gbWVhbl9waGkgJT4lIAogIGZ1bGxfam9pbihtZWFuX3BzaSkgJT4lIAogIGZ1bGxfam9pbihtZWFuX29tZWdhKSAlPiUgCiAgZnVsbF9qb2luKG1lYW5fYWxsX3ByZXZhbGVuY2UpCgpzdGF0ZV9zdW1tYXJpZXNfd2lkZSA8LSBzdGF0ZV9zdW1tYXJpZXMgJT4lCiAgZmlsdGVyKHBlcmlvZCA9PSAiUGFzdCIpICU+JQogIGZpbHRlcihiZXR3ZWVuKGRhdGUsIHNhbXBsZV9wZXJpb2RbMV0sIHNhbXBsZV9wZXJpb2RbMl0pKSAlPiUgCiAgZmlsdGVyKHNpbV90eXBlID09ICdzdGF0dXNfcXVvJykgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZ3JvdXBfYnkobG9jYXRpb24pICU+JSAKICBtdXRhdGUoQVVfb21lZ2EgPSBjdW1zdW0ob21lZ2EpKQoKQ0EgPC0gc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIGZpbHRlcihsb2NhdGlvbiA9PSAiQ2FsaWZvcm5pYSIpCgpsYWdmaWxsIDwtIGZ1bmN0aW9uKHgsIGxhZyxmaWxsPTEpIHsKICByZXBsYWNlX25hKGxhZyh4LGxhZyksZmlsbCkKfQoKQ0EgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKG9tZWdhLDApLCB5ID0gfnByZXZhbGVuY2UsIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkNhbGlmb3JuaWEiLHhheGlzPWxpc3QodGl0bGU9Im9tZWdhIikseWF4aXM9bGlzdCh0aXRsZT0icHJldmFsZW5jZSIpKQoKc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKG9tZWdhLDApLCB5ID0gfnByZXZhbGVuY2UsIGNvbG9yID0gfmxvY2F0aW9uLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlLCAnPC9icj4gU3RhdGU6ICcsIGxvY2F0aW9uICkpICU+JSAKICAgIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkFsbCBzdGF0ZXMiLCB4YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpLHlheGlzPWxpc3QodGl0bGU9InByZXZhbGVuY2UiKSkKCm1lYW5zICU+JSBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5vbWVnYSwgeSA9IH5wcmV2YWxlbmNlLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBPbWVnYTogJywgb21lZ2EsICc8L2JyPiBwcmV2YWxlbmNlOiAnLCBwcmV2YWxlbmNlLCAnPC9icj4gRGF0ZTogJywgZGF0ZSApKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiTWVhbiBvbWVnYSwgbWVhbiBwcmV2YWxlbmNlIChhY3Jvc3Mgc3RhdGVzKSIseGF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSx5YXhpcz1saXN0KHRpdGxlPSJwcmV2YWxlbmNlIikpCgpgYGAKCi0tLQoKQ2FsaWZvcm5pYSwgYW5kIG1lYW4gYWNyb3NzIHN0YXRlcywgYXQgdmFyeWluZyBsYWdzCgpgYGB7cn0KQ0EgJT4lIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUgCiAgZmlsdGVyKGJldHdlZW4oZGF0ZSwgc2FtcGxlX3BlcmlvZFsxXSwgc2FtcGxlX3BlcmlvZFsyXSkpICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bGFnZmlsbChvbWVnYSwwKSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAwIiwKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDcpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDciKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDE0KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAxNCIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMjEpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDIxIikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwyOCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMjgiKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ2FsaWZvcm5pYSwgb21lZ2EgYXQgdmFyeWluZyBsYWdzIiwgeGF4aXMgPSBsaXN0KHRpdGxlID0gIm9tZWdhIikpCgptZWFucyAlPiUgZmlsdGVyKGRhdGUgPCBmdXR1cmVbMV0pICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bGFnZmlsbChvbWVnYSwwKSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAwIiwKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgdGV4dCA9IH5wYXN0ZSgnPC9icj4gT21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gcHJldmFsZW5jZTogJywgcHJldmFsZW5jZSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDcpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDciKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDE0KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAxNCIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMjEpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDIxIikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwyOCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMjgiKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiTWVhbiBvbWVnYSwgbWVhbiBwcmV2YWxlbmNlIChhY3Jvc3Mgc3RhdGVzKVxub21lZ2EgYXQgdmFyeWluZyBsYWdzIiwgeGF4aXMgPSBsaXN0KHRpdGxlID0gIm9tZWdhIikpCgpgYGAKCi0tLQoKYikgcHJlZGljdG9yID0gQVVDIG9mIG9tZWdhIG92ZXIgdGltZTsgcmVzcG9uc2UgPSBjdW11bGF0aXZlIGFsbCBpbmZlY3Rpb25zIG92ZXIgdGltZQoKYGBge3J9CgpDQSAlPiUgZmlsdGVyKHBlcmlvZCA9PSAnUGFzdCcpICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bGFnZmlsbChBVV9vbWVnYSwwKSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gJ2xhZyAwJywgCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gQXJlYSB1bmRlciBPbWVnYTogJywgQVVfb21lZ2EsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gQ3VtdWxhdGl2ZSBpbmZlY3Rpb25zOiAnLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDcpLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAibGFnIDciKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDE0KSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gImxhZyAxNCIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsMjEpLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAibGFnIDIxIikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChBVV9vbWVnYSwyOCksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgbmFtZSA9ICJsYWcgMjgiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDU2KSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gImxhZyA1NiIpICU+JSAKICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJDYWxpZm9ybmlhLCBhcmVhIHVuZGVyIG9tZWdhIGF0IHZhcnlpbmcgbGFncyIseGF4aXM9bGlzdCh0aXRsZT0iQXJlYSB1bmRlciBvbWVnYSIpLHlheGlzPWxpc3QodGl0bGU9IkN1bXVsYXRpdmUgaW5mZWN0aW9ucyIpKQoKc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUgCiAgZmlsdGVyKGRhdGUgPiBidXJuaW5bMl0pICU+JQogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKEFVX29tZWdhLDApLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIGNvbG9yID0gfmxvY2F0aW9uLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IEFyZWEgdW5kZXIgT21lZ2E6ICcsIEFVX29tZWdhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IEN1bXVsYXRpdmUgaW5mZWN0aW9uczogJywgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2JyPiBEYXRlOiAnLCBkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gU3RhdGU6ICcsIGxvY2F0aW9uKSkgJT4lIAogICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQWxsIHN0YXRlcyIsIHhheGlzPWxpc3QodGl0bGU9IkFyZWEgdW5kZXIgb21lZ2EgKGxhZyAwKSIpLCB5YXhpcz1saXN0KHRpdGxlPSJDdW11bGF0aXZlIGluZmVjdGlvbnMiKSkKCgpgYGAKCi0tLQoKYykgcHJlZGljdG9yID0gQVVDIG9mIG9tZWdhOyByZXNwb25zZSA9IGN1bXVsYXRpdmUgYWxsIGluZmVjdGlvbnMKCmBgYHtyfQojIHN0YXRlX3N1bW1hcmllc193aWRlICU+JSAKIyAgIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUKIyAgIGZpbHRlcihkYXRlID4gYnVybmluWzJdKSAlPiUKIyAgIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUgCiMgICBzdW1tYXJpc2UoQVVfb21lZ2EgPSBtYXgoQVVfb21lZ2EpLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zID0gbWF4KGN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMpKSAlPiUgCiMgICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKIyAgICAgICAgICAgICAgICAgeCA9IH5BVV9vbWVnYSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLAojICAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAojICAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBBcmVhIHVuZGVyIE9tZWdhOiAnLCBBVV9vbWVnYSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IEN1bXVsYXRpdmUgaW5mZWN0aW9uczogJywgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IFN0YXRlOiAnLCBsb2NhdGlvbikpICU+JSAKIyAgICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ29ycmVsYXRpb24gb2YgY3VtdWxhdGl2ZSBpbmZlY3Rpb24gd2l0aCBBcmVhIHVuZGVyIG9tZWdhIiwgeGF4aXM9bGlzdCh0aXRsZT0iQXJlYSB1bmRlciBvbWVnYSIpLCB5YXhpcz1saXN0KHRpdGxlPSJDdW11bGF0aXZlIGluZmVjdGlvbnMiKSkKCnN0YXRlX3N1bW1hcmllc193aWRlICU+JSAKICBmaWx0ZXIocGVyaW9kID09ICdQYXN0JykgJT4lCiMgIGZpbHRlcihkYXRlID4gYnVybmluWzJdKSAlPiUKICBmaWx0ZXIoZGF0ZSA+PSBzYW1wbGVfcGVyaW9kWzFdICYgZGF0ZSA8PSBzYW1wbGVfcGVyaW9kWzJdKSAlPiUgCiAgZ3JvdXBfYnkobG9jYXRpb24pICU+JSAKICBzdW1tYXJpc2UoQVVfb21lZ2EgPSBtYXgoQVVfb21lZ2EpLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zID0gbWF4KGN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMpKSAlPiUgCiAgZ2dzdGF0c3Bsb3Q6Omdnc2NhdHRlcnN0YXRzKHggPSAiQVVfb21lZ2EiLCB5ID0gImN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMiLCB0eXBlID0gInNwZWFybWFuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIkNvcnJlbGF0aW9uIG9mIGN1bXVsYXRpdmUgaW5mZWN0aW9ucyB3aXRoIEFyZWEgdW5kZXIgb21lZ2EiKQoKYGBgCgotLS0KCmUpIG1hcCBvZiBzYW1lIChjb3JyZWxhdGlvbiwgYnkgc3RhdGUpCgpUbyBiZSBtYWRlCgojIENvcnJlbGF0aW9uIGJldHdlZW4gTW9iaWxpdHkgYW5kIE9tZWdhCgpgYGB7cn0KCkNBICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bW9iaWxpdHlfdHJlbmQsIHkgPSB+b21lZ2EsIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE1vYmlsaXR5OiAnLCBtb2JpbGl0eV90cmVuZCwgJzwvYnI+IG9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ2FsaWZvcm5pYSIseGF4aXM9bGlzdCh0aXRsZT0ibW9iaWxpdHkgdHJlbmQiKSx5YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpKQoKQ0EgJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGRhdGUgPCBmdXR1cmVbMV0pICU+JSAKICBmaWx0ZXIoZGF0ZSA+IGJ1cm5pblsyXSkgJT4lCiAgc2VsZWN0KGRhdGUsbW9iaWxpdHlfdHJlbmQsb21lZ2EpICU+JSAKICBnZ3N0YXRzcGxvdDo6Z2dzY2F0dGVyc3RhdHMoeCA9ICJtb2JpbGl0eV90cmVuZCIsIHkgPSAib21lZ2EiLCB0eXBlID0gInNwZWFybWFuIiwgdGl0bGUgPSAiQ2FsaWZvcm5pYSIpCgoKc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5tb2JpbGl0eV90cmVuZCwgeSA9IH5vbWVnYSwgY29sb3IgPSB+bG9jYXRpb24sCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gTW9iaWxpdHk6ICcsIG1vYmlsaXR5X3RyZW5kLCAnPC9icj4gb21lZ2E6ICcsIG9tZWdhLCAnPC9icj4gRGF0ZTogJywgZGF0ZSwgJzwvYnI+IFN0YXRlOiAnLCBsb2NhdGlvbiApKSAlPiUKICAgIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkFsbCBzdGF0ZXMiLCB4YXhpcz1saXN0KHRpdGxlPSJtb2JpbGl0eSB0cmVuZCIpLHlheGlzPWxpc3QodGl0bGU9Im9tZWdhIikpCgptZWFucyAlPiUgCiAgZmlsdGVyKGRhdGUgPCBmdXR1cmVbMV0pICU+JSAKICBmaWx0ZXIoZGF0ZSA+IGFzLkRhdGUoIjIwMjAtMDItMjUiKSkgJT4lICMgRmViIDI2IGlzIHRoZSBmaXJzdCBkYXkgd2l0aCBhbnkgbW9iaWxpdHkgPCAxCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfnBoaSwgeSA9IH5vbWVnYSwgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAogICAgICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgnPC9icj4gTW9iaWxpdHk6ICcsIHBoaSwgJzwvYnI+IG9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IERhdGU6ICcsIGRhdGUpKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiTWVhbiBtb2JpbGl0eSwgbWVhbiBvbWVnYSAoYWNyb3NzIHN0YXRlcykiLHhheGlzPWxpc3QodGl0bGU9Im1vYmlsaXR5IHRyZW5kIikseWF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSkKCmBgYAoKYGBge3J9CiMgbWVhbnMgJT4lIGZpbHRlcihkYXRlIDwgZnV0dXJlWzFdKSAlPiUgCiMgICBmaWx0ZXIoZGF0ZSA+IGJ1cm5pblsyXSkgJT4lCiMgICBnZ3NjYXR0ZXJoaXN0KHggPSAicGhpIiwgeSA9ICJvbWVnYSIsIAojICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSwgc2hhcGUgPSAxOSwgc2l6ZSA9IDMsICMgcG9pbnRzCiMgICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIAojICAgICAgICAgICBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICJibHVlIiwgZmlsbCA9ICJsaWdodGdyYXkiKSwKIyAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFLCAKIyAgICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKIyAgICAgICAgICAgeGxhYiA9ICJtb2JpbGl0eSB0cmVuZCIsIHlsYWIgPSAib21lZ2EiLAojICAgICAgICAgICBtYXJnaW4ucGxvdCA9ICJkZW5zaXR5IiwKIyAgICAgICAgICAgbWFyZ2luLmdndGhlbWUgPSB0aGVtZV92b2lkKCksCiMgICAgICAgICAgIG1hcmdpbi5zcGFjZSA9IEZBTFNFLAojICAgICAgICAgICBtYWluLnBsb3Quc2l6ZSA9IDIsCiMgICAgICAgICAgIG1hcmdpbi5wbG90LnNpemUgPSAxCiMgICAgICAgICAgICkKCm1lYW5zICU+JSBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAogIGZpbHRlcihkYXRlID4gYnVybmluWzJdKSAlPiUKICBnZ3N0YXRzcGxvdDo6Z2dzY2F0dGVyc3RhdHMoeCA9ICJwaGkiLCB5ID0gIm9tZWdhIiwgdHlwZSA9ICJzcGVhcm1hbiIsIHRpdGxlID0gIk1lYW4gcGhpLCBNZWFuIG9tZWdhIG92ZXIgYWxsIHN0YXRlcyIpCgoKYGBgCgojIFIgZWZmZWN0aXZlIGZvciBhbGwgc3RhdGVzCgpgYGB7ciBSX2VmZmVjdGl2ZSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NywgZXZhbCA9IFRSVUV9CmFsbF9yZSA8LSBzdGF0ZV9zdW1tYXJpZXMgJT4lCiAgZmlsdGVyKHZhcmlhYmxlID09ICJSX2UiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUoUl9lID0gbWVhbl92YWx1ZSkgJT4lIAogIGZpbHRlcihkYXRlIDw9IFN5cy5EYXRlKCkpICU+JSAKICBsZWZ0X2pvaW4oc3RhdGVkZiwgYnk9YygibG9jYXRpb24iID0gInN0YXRlX2Z1bGwiKSkgJT4lIAogIG11dGF0ZShyZWxhdGl2ZV9wb3AgPSB0b3RhbF9wb3AgLyBhbGxzdGF0ZXNfcG9wKQoKbWVhbl9yZSA8LSBhbGxfcmUgJT4lIGdyb3VwX2J5KGRhdGUpICU+JSBzdW1tYXJpc2UoUl9lID0gbWVhbihSX2UpKQoKd2VpZ2h0ZWRfbWVhbl9yZSA8LSBhbGxfcmUgJT4lIGdyb3VwX2J5KGRhdGUpICU+JSBzdW1tYXJpc2UoUl9lID0gc3VtKFJfZSpyZWxhdGl2ZV9wb3ApKQoKZ19yZSA8LSBnZ3Bsb3QoYWxsX3JlLCBhZXMoeCA9IGRhdGUsIHkgPSBSX2UsIGNvbG9yID0gbG9jYXRpb24pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJEIiwgZGlyZWN0aW9uID0gLTEsIGFscGhhID0gLjYsIGVuZCA9IC43NSkgKwogICMgdGhlbWVfZGFyayhiYXNlX2xpbmVfc2l6ZSA9IDAuNSkgKwogIGdlb21fbGluZShkYXRhID0gd2VpZ2h0ZWRfbWVhbl9yZSwgYWxwaGEgPSAuNiwgc2l6ZSA9IDIsIGNvbG9yID0gJ3JlZCcpICsKICAjIGdlb21fcmVjdChhZXMoeG1pbj1mdXR1cmVbMV0sIHhtYXg9ZnV0dXJlWzJdLCB5bWluPTAsIHltYXg9MSkpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSBmdXR1cmVbMV0sIHhtYXggPSBmdXR1cmVbMl0sIHltaW4gPSAwLCB5bWF4ID0gNSwgYWxwaGEgPSAuMikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKQoKcF9yZSA8LSBnX3JlICU+JSBwbG90bHk6OmdncGxvdGx5KCkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBUUlVFLAogICAgICAgICAgICAgICAgICMgbWFyZ2luID0gbGlzdChsID0gMTUwKSwKICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUl9lIikKICAgICAgICAgICAgICAgICApCgpwX3JlJHgkZGF0YVtbNTFdXSR0ZXh0IDwtIGdzdWIoJ3JlZCcsJ1dlaWdodGVkIG1lYW4gb2YgYWxsIHN0YXRlcycsIHBfcmUkeCRkYXRhW1s1MV1dJHRleHQpCgpwX3JlCmBgYAoKCiMgQ3Jvc3MgQ29ycmVsYXRpb24gYW1vbmcgdGltZXMgc2VyaWVzIG9mIFIgRWZmZWN0aXZlCgpgYGB7cn0KYWxsX3JlX3dpZGUgPC0gYWxsX3JlICU+JSAKICBzZWxlY3QoZGF0ZSwgbG9jYXRpb24sIFJfZSkgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBsb2NhdGlvbiwgdmFsdWVzX2Zyb20gPSBSX2UpICU+JSAKICBzZWxlY3QoLWRhdGUpCgp3ZXN0ZXJuc3RhdGVzIDwtIGFsbF9yZV93aWRlICU+JSBzZWxlY3QoYygiV2FzaGluZ3RvbiIsIk9yZWdvbiIsIkNhbGlmb3JuaWEiKSkKQ0FfRkwgPC0gYWxsX3JlX3dpZGUgJT4lIHNlbGVjdChjKCJDYWxpZm9ybmlhIiwiRmxvcmlkYSIpKQoKCmNjZm1hdHJpeCA8LSBmdW5jdGlvbih4KXsKICAjIGluaXQgbWF0cml4IG9mIGFjZiBvYmplY3RzIGFuZCBtYXRyaXggb2YgZ2dwbG90cwogIG1saXN0IDwtIGdsaXN0IDwtIG1hdHJpeChsaXN0KCksIG5jb2wgPSBuY29sKHgpLCBucm93ID0gbmNvbCh4KSkKICAKICAjIGZpbGwgbWF0cml4IHdpdGggcGFpcndpc2UgY3Jvc3MgY29ycmVsYXRpb24gZnVuY3Rpb25zCiAgZm9yKGkgaW4gMTpuY29sKHgpKXsKICAgIGZvcihqIGluIDE6bmNvbCh4KSl7CiAgICAgIGNjZiA8LSBjY2YoeCA9IHhbLGldLCB5PSB4WyxqXSwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFKQogICAgICBnIDwtIGdncGxvdDI6OmF1dG9wbG90KGNjZikgKyB0aGVtZV9taW5pbWFsKCkgKwogICAgICAgIHlsaW0oLTEsMSkgKyAKICAgICAgICBsYWJzKHRpdGxlPXBhc3RlMChuYW1lcyh4KVtpXSwiICIsIG5hbWVzKHgpW2pdKSwgeCA9ICIiLCB5PSIiKSArCiAgICAgICAgdGhlbWUoCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwwLDApLCAiY20iKQogICAgICAgICAgKQogICAgICBtbGlzdFtpLGpdIDwtIGxpc3QoY2NmKQogICAgICBnbGlzdFtqLGldIDwtIGxpc3QoZykKICAgIH0KICB9CiAgcmV0dXJuKGxpc3QoZGF0YT1tbGlzdCxwbG90cz1nbGlzdCkpCn0KCiMgY2FsY3VsYXRlIGNyb3NzIGNvcnJlbGF0aW9uIGZ1bmN0aW9ucyBmb3IgZWFjaCBzdGF0ZSBwYWlyCm4gPC0gNApyZV9jY2ZfbWF0cml4IDwtIGNjZm1hdHJpeChhbGxfcmVfd2lkZVssMTpuXSkKICAKIyBwbG90IENDRiBmb3IgYSBwYWlyIG9mIHN0YXRlcwojIGcxIDwtIHJlX2NjZl9tYXRyaXhbMSwyXVtbMV1dICU+JSBnZ3Bsb3QyOjphdXRvcGxvdCgpK2xhYnModGl0bGU9IiIsIHggPSAiIiwgeT0iIikKCiMgZ3JvYnMgPC0gbGlzdChnMSxnMSxnMSxnMSkKCnBsb3RfY2NmX21hdHJpeCA8LSBmdW5jdGlvbih4KSB7CiAgZ3JpZEV4dHJhOjpncmlkLmFycmFuZ2UoCiAgICBncm9icz14JHBsb3RzLAogICAgbnJvdz1uY29sKHgkZGF0YSksCiAgICBuY29sPW5jb2wobmNvbCh4JGRhdGEpKQogICAgKQp9CiAgCmNjZm1hdHJpeChhbGxfcmVfd2lkZVssYygiRGVsYXdhcmUiLCJHZW9yZ2lhIildKSAlPiUgcGxvdF9jY2ZfbWF0cml4KCkKCmBgYAoKIyBDb3JyZWxhdGlvbiBhbW9uZyB0aW1lcyBzZXJpZXMgb2YgUiBFZmZlY3RpdmUKCmBgYHtyfQphbGxfcmVfd2lkZSA8LSBhbGxfcmUgJT4lIAogIHNlbGVjdChkYXRlLCBsb2NhdGlvbiwgUl9lKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGxvY2F0aW9uLCB2YWx1ZXNfZnJvbSA9IFJfZSkgJT4lIAogIHNlbGVjdCgtZGF0ZSkKCmNvcnJtYXRyaXggPC0gY29yKGFsbF9yZV93aWRlLCB1c2UgPSAiY29tcGxldGUub2JzIikKCmhlYXRtYXAoY29ycm1hdHJpeCwgc2NhbGUgPSAibm9uZSIpCgojIFJlb3JkZXIgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeApjb3JtYXQgPC0gcmVvcmRlcl9jb3JtYXQoY29ybWF0KQoKCiMgcmVvcmRlcl9jb3JtYXQgPC0gZnVuY3Rpb24oY29ybWF0KXsKIyAjIFVzZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHZhcmlhYmxlcyBhcyBkaXN0YW5jZQojIGRkIDwtIGFzLmRpc3QoKDEtY29ybWF0KS8yKQojIGhjIDwtIGhjbHVzdChkZCkKIyBjb3JtYXQgPC1jb3JtYXRbaGMkb3JkZXIsIGhjJG9yZGVyXQojIH0KIyAKIyB1cHBlcl90cmkgPC0gZ2V0X3VwcGVyX3RyaShjb3JtYXQpCiMgIyBNZWx0IHRoZSBjb3JyZWxhdGlvbiBtYXRyaXgKIyBtZWx0ZWRfY29ybWF0IDwtIG1lbHQodXBwZXJfdHJpLCBuYS5ybSA9IFRSVUUpCiMgIyBDcmVhdGUgYSBnZ2hlYXRtYXAKIyBnZ2hlYXRtYXAgPC0gZ2dwbG90KG1lbHRlZF9jb3JtYXQsIGFlcyhWYXIyLCBWYXIxLCBmaWxsID0gdmFsdWUpKSsKIyAgZ2VvbV90aWxlKGNvbG9yID0gIndoaXRlIikrCiMgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiLCBtaWQgPSAid2hpdGUiLCAKIyAgICBtaWRwb2ludCA9IDAsIGxpbWl0ID0gYygtMSwxKSwgc3BhY2UgPSAiTGFiIiwgCiMgICAgIG5hbWU9IlBlYXJzb25cbkNvcnJlbGF0aW9uIikgKwojICAgdGhlbWVfbWluaW1hbCgpKyAjIG1pbmltYWwgdGhlbWUKIyAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCAKIyAgICAgc2l6ZSA9IDEyLCBoanVzdCA9IDEpKSsKIyAgY29vcmRfZml4ZWQoKQojICMgUHJpbnQgdGhlIGhlYXRtYXAKIyBwcmludChnZ2hlYXRtYXApCgpgYGAKCiMgQXJlIHBhaXJ3aXNlIHN0YXRlIFJfZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgY29ycmVsYXRlZCB3aXRoIHRoZSBkaXN0YW5jZXMgYmV0d2VlbiBzdGF0ZSBjZW50cm9pZHM/Cg==